package cc.lucien.demo02;

/**
 * 排序辅助类，排序完成之后，因为数据量太大
 * 无法人眼进行排序结果正确性的判断，或者是为了复用测试代码等等等...
 * 所以封装一个辅助类
 */
public class SortingHelper {
    private SortingHelper(){}

    /**
     * 判断一个数组是否是有序的
     * 想要判断是否有序，就需要比较
     * 所以不可以是任意泛型，要加以约束
     * 需要是 Compareable 类型，或者是它的子类
     * @param arr
     * @param <E>
     * @return
     */
    public static <E extends Comparable<E>> boolean isSorted(E[] arr){
        for (int i = 1; i < arr.length; i++){
            if (arr[i - 1].compareTo(arr[i]) > 0) //如果前面的数大于后面的数，返回false
                return false;
        }
        return true;
    }

    /**
     * 排序算法的测试方法，根据不同的 name 调用不同的方法
     * 打印测试时间
     * @param sortname
     * @param arr
     * @param <E>
     */
    public static <E extends Comparable<E>> void sortTest(String sortname, E[] arr){
        long startTime = System.nanoTime();
        if (sortname.equals("SelectionSort"))
            SelectionSort.sort(arr);
        else if (sortname.equals("InsertionSort"))
            InsertionSort.sort(arr);
        else if (sortname.equals("InsertionSort2"))
            InsertionSort.sort2(arr);
        long endTime = System.nanoTime();

        if (!SortingHelper.isSorted(arr))
            throw new RuntimeException(sortname + " failed");
        double time = (endTime - startTime) / 1000000000.0;
        System.out.println(String.format("%s,n = %d : %f s",sortname, arr.length, time));
    }

}
